/**
 *  @description 此处请求封装适用于普通request请求需要携带token的应用场景
 *  @param config config 是全局的配置文件对象(包含url/appid等一些其他你项目需要用到的配置信息)
 *  @param getToken getToken 是获取本地存储token的方法
 *  @param setToken setToken 是设置本地存储token的方法
 *  @param tool tool 是封装的一些公共API适用方法(toast/confirm...)
 *  @param timeout timeout 设置请求超时时间
 *  @author Coding by Akai,Dear user,if you think this a litte uncertain,please add my WeChat to contact me;
 *  @description WeChat Akaibiu (添加时请备注来意,谢谢~!!!)
 *  @version 1.0.0
 */
import config from "@/config/config.js"
import { getToken, getUserInfo, logout } from "@/utils/auth"
import tool from "@/utils/common.js"
let timeout = 600000
const baseUrl = config.baseUrl
const request = (config) => {
  /**
   * @description  如果isToken为true的时候需要token(一般会在登录的时候存储token和token_type)  为false不需要token
   * @description  config.header['Authorization'] = 'Bearer ' + uni.getStorageSync('token'); // token_type 一般情况下为'Bearer ' 切记有空格哦
   * @description  config.header['Content-Type'] = 'application/x-www-form-urlencoded'; // 常规请求头配置
   */

  config.header = config.header || {}
  config.header["access-token"] = getToken("token")
  const userInfo = getUserInfo() || {}
  const headers = config.headers || {}
  if (headers.isToken && !userInfo.username) {
    uni.showToast({
      title: "登录已过期，请重新登录",
      icon: "none",
      duration: 1500
    })
    return logout()
  }
  /**
   * @description  get请求映射params参数
   */
  if (config.params) {
    let url = config.url + "?" + tool.tansParams(config.params)
    url = url.slice(0, -1)
    config.url = url
  }
  return new Promise((resolve, reject) => {
    const useToast = config.useToast !== false
    uni.showLoading({})
    uni.request({
      method: config.method || "get",
      timeout: config.timeout || timeout,
      url: config.baseUrl || baseUrl + config.url,
      data: config.data,
      header: config.header,
      dataType: "json",
      success(res) {
        console.log("res :>> "+ config.url, res.data.data)

        if (res.data.code == "0") {
          resolve(res.data.data)
        } else {
          if (useToast) {
            uni.showToast({
              title: res.data.msg,
              icon: "none",
              duration: 1500
            })
          }
          reject(res.data)
        }
      },
      fail: (error) => {
        console.log("error :>> ", error)
        let { statusCode } = error
        if (statusCode === 401) {
          uni.showToast({
            title: "登录已过期，请重新登录",
            icon: "none",
            duration: 1500
          })
          reject(error)
          return logout()
        } 
        /**
         * @description 请求失败返回的消息
         */
        reject(error)
      },
      complete() {
        /**
         * @description 请求完做的事
         */
        uni.hideLoading({noConflict: true})
      }
    })
  })
}

/**
 *  @description 暴露出request请求供其他业务使用
 */

export default request
